<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    // 在js中  先执行同步的任务，当所有的同步任务都执行完，才去任务队列里面去通知异步任务，然后执行
    // function fn(cb){
    //     console.log(cb);
    //     let a = 10
    //     setTimeout(()=>{ //异步
    //        a = 20 
    //        cb(a)

    //     },1)
    //     return a
    // }
    // // console.log(fn());//10
    // // 如何打印20？？？？？  回调函数可以解决
    // // let fn1=(val)=>{
    // //     console.log(val);
    // // }
    // // // 把fn1当成fn的参数 
    // // console.log(fn(fn1));
    // fn((val)=>{
    //     console.log(val);
    // })

    // promise 解决
    // Promise 是异步编程的一种解决方案  可以理解为存放异步的盒子
    // 他有三个状态 进行中  已成功  已失败  他有2个操作 
    // 他接受一个函数作为参数，这个函数又接受2个参数  resolve （成功）  reject（失败）
    function fn(){
        let a = 10
        return new Promise((resolve,reject)=>{
            setTimeout(()=>{
                a=20 
                resolve(a)
                // reject(a)
            })
        })
    }
    console.log(fn());//fn()是一个promise对象  所以就可以用promise原型上的方法  .then  .catch .finally


    // finally()方法用于指定不管 Promise 对象最后状态如何，都会执行的操作。该方法是 ES2018 引入标准的。

    // es8的finally

    fn().then(res=>{
        console.log(res);
    }).catch((err)=>{
        console.log(err);

    }).finally(()=>{
        console.log('我什么时候会执行');
    })
// 案例

function timeout(ms) {
  return new Promise((resolve, reject) => {
    // setTimeout(resolve, ms, 'done');
    setTimeout(()=>{
        resolve('done')
    },ms)
  });
}

timeout(100).then((value) => {
  console.log(value);
});
    







   


</script>
</html>